package com.fwx.label;

/**
 * @author : fengwenxiang
 * @date : 2022/7/10 9:55
 * @description：
 */
public class MyLabel_Goto {
    /**单层循环中看不出标签的效果，测试01和02不使用标签也是一样的作用**/
    //标签+break
    public static void test01(){
        int i = 0;
        label1:
        for (int a = 0; a < 5; a++){
            i++;
            if(a == 2){
                break label1;
            }
            System.out.println("i = "+i);
        }
    }
    //标签+continue
    public static void test02(){
        int j = 0;
        label1:
        for (int a = 0; a < 5; a++){
            j++;
            if(a == 2){
                continue label1;
            }
            System.out.println("j = "+j);
        }
    }
    //多层循环
    //1.break中断内部循环，回到外部循环
    //2.break 标签;中断内部迭代，回到标签处，但不重新进入，完全终止了两个循环
    public static void test03(){
        System.out.println("=======label3 break label=======");
        int h = 0;
        label3:
        for (int a = 0; a < 3; a++) {
            for (int b = 0; b < 4; b++) {
                h++;
                if (b==2){
                    break ;
                }
                System.out.println("h = "+h);
            }
        }

    }
    //停止当次循环，开始下一次，跳转到标签处，从外循环继续，而内循环的b=3已经被跳过了，所以后续的都不会有b=3的情况
    public static void test04(){
        System.out.println("=======label4 continue label=======");
        int k = 0;
        label4:
        for (int a = 0; a < 3; a++) {
            System.out.println("第一层循环a="+a);
            for (int b = 0; b < 4; b++) {
                System.out.println("第二层循环b="+b);
                k++;
                if (b==2){
                    continue label4;
                }
                System.out.println("k = "+k);
            }
        }
    }

    public static void test05(){
        System.out.println("=======label5 break label=======");
        int kk = 0;
        for (int a = 0; a < 6; a++) {
            System.out.println("第一层循环a="+a);
            label5:
            for (int b = 0; b < 4; b++) {
                System.out.println("第二层循环b="+b);
                for (int c = 0; c < 3; c++) {
                    kk++;
                    if (c==2){
                        break label5;//到标签后不再进入循环，但第一层循环不影响，继续执行
                    }
                    System.out.println("kk = "+kk);
                }
            }
        }
    }

    public static void main(String[] args) {
        MyLabel_Goto.test05();
        /**
         * 一般break会中断并跳出当前循环，如果嵌套的话，外层循环还是会继续执行
         * 一般continue中断当次循环，继续下一次循环
         * break 标签；会中断并跳出标签所指的循环
         * continue 标签；会中断当次循环，达到标签所在位置，并继续进入标签后的循环
         * **/
    }
}
